<?php
/**
 * File Cache
 */
class Core_Cache extends Core_Base
{
    private $memcache;
    function __construct()
    {
        parent::__construct();
        $this->memcache = new Memcache();
        $this->memcache->connect('127.0.0.1', 11211);
    }

    /**
     * 获取对应路径缓存目录下的CSV文件数据
     * @param String $filePath  原始CSV文件路径
     */
    function getCsvData($filePath)
    {
        $cacheFile  =   $this->getFile($filePath);;
        if($cacheFile   ==  null){
            if(is_file($filePath)){
                $utf8Data   =   Core_IoUtils::instance()->getUtf8($filePath);
                $this->saveFile($filePath, $utf8Data);
            }
            $cacheFile  =   $this->getFile($filePath);
        }
        if(!empty($cacheFile) && is_file($cacheFile)){
            return Core_IoUtils::instance()->getCsv($cacheFile);
        }
        return null;
    }

    /**
     * 获取缓存好的文件路径
     * @param String $filePath  要缓存的路径
     */
    function getFile($filePath)
    {
        $dir    =   ROOT_DIR . DS . 'asset/cache/file/' . md5($filePath) . '.cache';
        if( is_dir($dir) ){
            $file   =   Core_IoUtils::instance()->getFirstFile($dir);
            if( !empty($file) ){
                if( DEBUG == false ) {
                    return $file;
                } else {
                    if( md5_file($filePath) == current(explode('.', basename($file))) ){
                        return $file;
                    }
                }
            }
        }
        return null;
    }

    /**
     * 缓存指定路径文件
     * @param String $filePath  需要缓存的文件路径
     * @param String $datas     需要缓存的数据
     */
    function saveFile($filePath, $datas)
    {
        $file   =   md5($filePath);
        $dir        =   ROOT_DIR . DS . 'asset/cache/file/' . $file . '.cache';
        if( !is_dir($dir) ){
            Core_IoUtils::instance()->createDir($dir);
        } else {
            $file   =   Core_IoUtils::instance()->getFirstFile($dir);
            if($file != null){
                Core_IoUtils::instance()->deleteFile($file);
            }
        }
        Core_IoUtils::instance()->writeFile($dir . '/' . md5_file($filePath) . '.cache', $datas);
    }

    /**
     * 获取缓存好的数据
     * @param String $key   要缓存的路径
     */
    function getData($key)
    {
        return $this->memcache->get($key);
    }

    /**
     * 缓存指定Key数据
     * @param String $key   需要缓存的文件路径
     * @param String $datas     需要缓存的数据
     */
    function saveData($key, $datas)
    {
        $this->memcache->set($key, $datas);
    }

    function clearData($key)
    {
        $this->memcache->delete($key);
    }

    function getUrl($url)
    {
        $key = md5($url);
        $tmp = $this->memcache->get($key);
        if (empty($tmp)) {
            $model = sfget_instance('Core_Model_Url');
            $result = $model->getUrl(str_replace(REWRITE_SUFFIX, '', $url));
            if (isset($result['url__origin_url'])) {
                $this->saveData($key, $result['url__origin_url']);
                return $result['url__origin_url'];
            }
        }
        return $tmp;
    }

    function getDatas($prefix, $key)
    {
        $p = $this->getData($prefix);
        if (!empty($p)) {
            return $this->getData($key . $p);
        }
        return null;
    }

    function saveDatas($prefix, $key, $datas)
    {
        $p = $this->getData($prefix);
        if (empty($p)) {
            $p = time();
            $this->saveData($prefix, $p);
        }
        return $this->saveData($key . $p, $datas);
    }

    function clearDatas($prefix)
    {
        $this->saveData($prefix, time());
    }

    function saveDatasDbAll($prefix, $db, $result)
    {
        $sql = $result->assemble();
        $tDatas = $this->getDatas($prefix, $sql);
        if (empty($tDatas)) {
            $datas = $db->fetchAll($sql);
            $this->saveDatas($prefix, $sql, $datas);
        } else {
            $datas = $tDatas;
        }
        return $datas;
    }

    function saveDatasDbRow($prefix, $db, $result)
    {
        $sql = $result->assemble();
        $tDatas = $this->getDatas($prefix, $sql);
        if (empty($tDatas)) {
            $data = $db->fetchRow($sql);
            $this->saveDatas($prefix, $sql, $data);
        } else {
            $data = $tDatas;
        }
        return $data;
    }

    function saveDatasDbOne($prefix, $db, $result)
    {
        $sql = $result->assemble();
        $tDatas = $this->getDatas($prefix, $sql);
        if (empty($tDatas)) {
            $data = $db->fetchOne($sql);
            $this->saveDatas($prefix, $sql, $data);
        } else {
            $data = $tDatas;
        }
        return $data;
    }


}